package top.ninwoo.weixingsim.service;

import top.ninwoo.weixingsim.entity.WeiXingData;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * 有关卫星的服务
 * 1.解析初始文本，得到初始的卫星状态
 * 2.将卫星的状态写入一个List中
 * 3.增删改查四种基本功能
 */

public interface Weixing {

    /**
     * @description 从文本中获取卫星的初始状态，但是其中的数据均为string型
     * @param file  传入的文本路径
     * @return      返回一个List
     */
    List<Map> parseTxt(File file);

    /**
     * @description 将parseTxt中得到的Map转化为初始的卫星数据
     * @param wx    WeiXingData类
     * @param map   parseTxt得到的Map
     * @return      单个卫星数据
     * @throws IllegalAccessException
     */
    WeiXingData initWX(Class wx,Map map)throws IllegalAccessException;

    List<WeiXingData> initNet(List<Map> maps) throws IllegalAccessException;

    /**
     * @description 根据卫星高度计算出卫星的速度，取逆时针为正方向。
     * @description 和addAxis不同，只需计算一次即可
     * @param wx    WeiXingData对象
     * @return
     */
    List<WeiXingData> addSpeed(List<WeiXingData> wx);

    /**
     * @description 根据角度，高度，速度和间隔时间t获取卫星的坐标数据
     * @param wx    WeiXingData对象
     * @return
     */
    List<WeiXingData> addAxis(List<WeiXingData> wx);

    /**
     * @description 为每个卫星添加序号值
     * @param wx 卫星List
     * @return bool类型
     */
    boolean addIndex(List<WeiXingData> wx);

    /**
     * @description 确认index和卫星List的对应关系
     * @param wx 卫星List
     * @return boolean
     */
    boolean checkIndex(List<WeiXingData> wx);

    /**
     * @description 确保卫星列表中中没有名字重复的卫星
     * @param wx 卫星List
     */
    void checkWX(List<WeiXingData> wx);
    /**
     增删改查的功能
     */
    /**
     * @description 根据提供的appName查找对应的序列号
     * @param weiXingDataList 卫星List
     * @param appName 卫星名字
     * @return index 序列号
     */
    Integer findindex(List<WeiXingData> weiXingDataList, String appName);

    /**
     * @description 查找功能
     * @param weiXingDataList 传入的卫星列表
     * @param appName 查找的卫星名字
     * @return 卫星数据
     */
    WeiXingData findWX(List<WeiXingData> weiXingDataList, String appName);

    /**
     * @description 增加一个卫星，这里无需考虑顺序问题，卫星主要靠名字搜索
     * @param weiXingDataList 旧的卫星List数据
     * @param newWX  新的卫星数据
     * @return 新的卫星List数据
     */
    List<WeiXingData> addWX(List<WeiXingData> weiXingDataList, WeiXingData newWX);

    /**
     * @description 删除指定的卫星
     * @param weiXingDataList 旧的卫星List数据
     * @param appName 指定卫星的名字
     * @return 新的卫星List
     */
    List<WeiXingData> delWX(List<WeiXingData> weiXingDataList, String appName);

    /**
     * @description 修改给定卫星的给定值,只能修改高度
     * @param weiXingDataList 旧的卫星List
     * @param appName 要修改的卫星名字
     * @param field 要修改的属性
     * @param val 要改成的值，传入为String类型，可在代码中转化为Double类型的值
     * @return 新的卫星List
     */
    List<WeiXingData> changeWX(List<WeiXingData> weiXingDataList, String appName, String field, String val);

    /**
     * @description 初始化拓扑
     * @param file  传入文件路径
     * @return      返回为卫星List
     */
    List<WeiXingData> iniTopo(File file) throws IllegalAccessException;

    /**
     * @description 改变拓扑
     * @param wxData 旧的网络
     * @param time   抽样时间
     * @return       改变后的网络
     */
    List<WeiXingData> changeTopo(List<WeiXingData> wxData,int time);

    /**
     * @description 增减卫星时需要调用
     * @param wxData
     * @return
     */
    List<WeiXingData> initChangeTopo(List<WeiXingData> wxData);
}


